<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

/**
 * Think 基础函数库
 * @category   Think
 * @package  Common
 * @author   liu21st <liu21st@gmail.com>
 */

/**
 * 获取模版文件 格式 项目://分组@主题/模块/操作
 * @param string $name 模版资源地址
 * @param string $layer 视图层（目录）名称
 * @return string
 */
function T($template = '', $layer = '') {
	if (is_file($template)) {
		return $template;
	}
	// 解析模版资源地址
	if (false === strpos($template, '://')) {
		$template = APP_NAME . '://' . str_replace(':', '/', $template);
	}
	$info  = parse_url($template);
	$file  = $info['host'] . (isset($info['path']) ? $info['path'] : '');
	$group = isset($info['user']) ? $info['user'] . '/' : (defined('GROUP_NAME') ? GROUP_NAME . '/' : '');
	$app   = $info['scheme'];
	$layer = $layer ? $layer : C('DEFAULT_V_LAYER');

	// 获取当前主题的模版路径
	if (($list = C('EXTEND_GROUP_LIST')) && isset($list[$app])) {
		// 扩展分组
		$baseUrl = $list[$app] . '/' . $group . $layer . '/';
	} elseif (1 == C('APP_GROUP_MODE')) {
		// 独立分组模式
		$baseUrl = dirname(BASE_LIB_PATH) . '/' . $group . $layer . '/';
	} else {
		$baseUrl = TMPL_PATH . $group;
	}

	// 分析模板文件规则
	if ('' == $file) {
		// 如果模板文件名为空 按照默认规则定位
		$file = MODULE_NAME . C('TMPL_FILE_DEPR') . ACTION_NAME;
	} elseif (false === strpos($file, '/')) {
		$file = MODULE_NAME . C('TMPL_FILE_DEPR') . $file;
	}
	return $baseUrl . $file . C('TMPL_TEMPLATE_SUFFIX');
}

/**
 * 获取输入参数 支持过滤和默认值
 * 使用方法:
 * <code>
 * I('id',0); 获取id参数 自动判断get或者post
 * I('post.name','','htmlspecialchars'); 获取$_POST['name']
 * I('get.'); 获取$_GET
 * </code>
 * @param string $name 变量的名称 支持指定类型
 * @param mixed $default 不存在的时候默认值
 * @param mixed $filter 参数过滤方法
 * @return mixed
 */
function I($name, $default = '', $filter = null) {
	if (strpos($name, '.')) {
		// 指定参数来源
		list($method, $name) = explode('.', $name, 2);
	} else {
		// 默认为自动判断
		$method = 'param';
	}
	switch (strtolower($method)) {
		case 'get':$input = &$_GET;
			break;
		case 'post':$input = &$_POST;
			break;
		case 'put':parse_str(file_get_contents('php://input'), $input);
			break;
		case 'param':
			switch ($_SERVER['REQUEST_METHOD']) {
				case 'POST':
					$input = $_POST;
					break;
				case 'PUT':
					parse_str(file_get_contents('php://input'), $input);
					break;
				default:
					$input = $_GET;
			}
			if (C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS')])) {
				$input = array_merge($input, $_GET[C('VAR_URL_PARAMS')]);
			}
			break;
		case 'request':$input = &$_REQUEST;
			break;
		case 'session':$input = &$_SESSION;
			break;
		case 'cookie':$input = &$_COOKIE;
			break;
		case 'server':$input = &$_SERVER;
			break;
		case 'globals':$input = &$GLOBALS;
			break;
		default:
			return NULL;
	}
	// 全局过滤
	// array_walk_recursive($input,'filter_exp');
	if (C('VAR_FILTERS')) {
		$_filters = explode(',', C('VAR_FILTERS'));
		foreach ($_filters as $_filter) {
			// 全局参数过滤
			array_walk_recursive($input, $_filter);
		}
	}
	if (empty($name)) {
		// 获取全部变量
		$data    = $input;
		$filters = isset($filter) ? $filter : C('DEFAULT_FILTER');
		if ($filters) {
			$filters = explode(',', $filters);
			foreach ($filters as $filter) {
				$data = array_map($filter, $data); // 参数过滤
			}
		}
	} elseif (isset($input[$name])) {
		// 取值操作
		$data    = $input[$name];
		$filters = isset($filter) ? $filter : C('DEFAULT_FILTER');
		if ($filters) {
			$filters = explode(',', $filters);
			foreach ($filters as $filter) {
				if (function_exists($filter)) {
					$data = is_array($data) ? array_map($filter, $data) : $filter($data); // 参数过滤
				} else {
					$data = filter_var($data, is_int($filter) ? $filter : filter_id($filter));
					if (false === $data) {
						return isset($default) ? $default : NULL;
					}
				}
			}
		}
	} else {
		// 变量默认值
		$data = isset($default) ? $default : NULL;
	}
	return $data;
}

/**
 * 记录和统计时间（微秒）和内存使用情况
 * 使用方法:
 * <code>
 * G('begin'); // 记录开始标记位
 * // ... 区间运行代码
 * G('end'); // 记录结束标签位
 * echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位
 * echo G('begin','end','m'); // 统计区间内存使用情况
 * 如果end标记位没有定义，则会自动以当前作为标记位
 * 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
 * </code>
 * @param string $start 开始标签
 * @param string $end 结束标签
 * @param integer|string $dec 小数位或者m
 * @return mixed
 */
function G($start, $end = '', $dec = 4) {
	static $_info = array();
	static $_mem  = array();
	if (is_float($end)) {
		// 记录时间
		$_info[$start] = $end;
	} elseif (!empty($end)) {
		// 统计时间和内存使用
		if (!isset($_info[$end])) {
			$_info[$end] = microtime(TRUE);
		}

		if (MEMORY_LIMIT_ON && $dec == 'm') {
			if (!isset($_mem[$end])) {
				$_mem[$end] = memory_get_usage();
			}

			return number_format(($_mem[$end] - $_mem[$start]) / 1024);
		} else {
			return number_format(($_info[$end] - $_info[$start]), $dec);
		}

	} else {
		// 记录时间和内存使用
		$_info[$start] = microtime(TRUE);
		if (MEMORY_LIMIT_ON) {
			$_mem[$start] = memory_get_usage();
		}

	}
}

/**
 * 设置和获取统计数据
 * 使用方法:
 * <code>
 * N('db',1); // 记录数据库操作次数
 * N('read',1); // 记录读取次数
 * echo N('db'); // 获取当前页面数据库的所有操作次数
 * echo N('read'); // 获取当前页面读取次数
 * </code>
 * @param string $key 标识位置
 * @param integer $step 步进值
 * @return mixed
 */
function N($key, $step = 0, $save = false) {
	static $_num = array();
	if (!isset($_num[$key])) {
		$_num[$key] = (false !== $save) ? S('N_' . $key) : 0;
	}
	if (empty($step)) {
		return $_num[$key];
	} else {
		$_num[$key] = $_num[$key] + (int) $step;
	}

	if (false !== $save) {
		// 保存结果
		S('N_' . $key, $_num[$key], $save);
	}
}

/**
 * 字符串命名风格转换
 * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
 * @param string $name 字符串
 * @param integer $type 转换类型
 * @return string
 */
function parse_name($name, $type = 0) {
	if ($type) {
		return ucfirst(preg_replace("/_([a-zA-Z])/e", "strtoupper('\\1')", $name));
	} else {
		return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
	}
}

/**
 * 优化的require_once
 * @param string $filename 文件地址
 * @return boolean
 */
function require_cache($filename) {
	static $_importFiles = array();
	if (!isset($_importFiles[$filename])) {
		if (file_exists_case($filename)) {
			require $filename;
			$_importFiles[$filename] = true;
		} else {
			$_importFiles[$filename] = false;
		}
	}
	return $_importFiles[$filename];
}

/**
 * 批量导入文件 成功则返回
 * @param array $array 文件数组
 * @param boolean $return 加载成功后是否返回
 * @return boolean
 */
function require_array($array, $return = false) {
	foreach ($array as $file) {
		if (require_cache($file) && $return) {
			return true;
		}

	}
	if ($return) {
		return false;
	}

}

/**
 * 区分大小写的文件存在判断
 * @param string $filename 文件地址
 * @return boolean
 */
function file_exists_case($filename) {
	if (is_file($filename)) {
		if (IS_WIN && C('APP_FILE_CASE')) {
			if (basename(realpath($filename)) != basename($filename)) {
				return false;
			}

		}
		return true;
	}
	return false;
}

/**
 * 导入所需的类库 同java的Import 本函数有缓存功能
 * @param string $class 类库命名空间字符串
 * @param string $baseUrl 起始路径
 * @param string $ext 导入的文件扩展名
 * @return boolean
 */
function import($class, $baseUrl = '', $ext = '.class.php') {
	static $_file = array();
	$class        = str_replace(array('.', '#'), array('/', '.'), $class);
	if ('' === $baseUrl && false === strpos($class, '/')) {
		// 检查别名导入
		return alias_import($class);
	}
	if (isset($_file[$class . $baseUrl])) {
		return true;
	} else {
		$_file[$class . $baseUrl] = true;
	}

	$class_strut = explode('/', $class);
	if (empty($baseUrl)) {
		$libPath = defined('BASE_LIB_PATH') ? BASE_LIB_PATH : LIB_PATH;
		if ('@' == $class_strut[0] || APP_NAME == $class_strut[0]) {
			//加载当前项目应用类库
			$baseUrl = dirname($libPath);
			$class   = substr_replace($class, basename($libPath) . '/', 0, strlen($class_strut[0]) + 1);
		} elseif ('think' == strtolower($class_strut[0])) {
			// think 官方基类库
			$baseUrl = CORE_PATH;
			$class   = substr($class, 6);
		} elseif (in_array(strtolower($class_strut[0]), array('org', 'com'))) {
			// org 第三方公共类库 com 企业公共类库
			$baseUrl = LIBRARY_PATH;
		} else {
			// 加载其他项目应用类库
			$class   = substr_replace($class, '', 0, strlen($class_strut[0]) + 1);
			$baseUrl = APP_PATH . '../' . $class_strut[0] . '/' . basename($libPath) . '/';
		}
	}
	if (substr($baseUrl, -1) != '/') {
		$baseUrl .= '/';
	}

	$classfile = $baseUrl . $class . $ext;
	if (!class_exists(basename($class), false)) {
		// 如果类不存在 则导入类库文件
		return require_cache($classfile);
	}
}

/**
 * 基于命名空间方式导入函数库
 * load('@.Util.Array')
 * @param string $name 函数库命名空间字符串
 * @param string $baseUrl 起始路径
 * @param string $ext 导入的文件扩展名
 * @return void
 */
function load($name, $baseUrl = '', $ext = '.php') {
	$name = str_replace(array('.', '#'), array('/', '.'), $name);
	if (empty($baseUrl)) {
		if (0 === strpos($name, '@/')) {
			//加载当前项目函数库
			$baseUrl = COMMON_PATH;
			$name    = substr($name, 2);
		} else {
			//加载ThinkPHP 系统函数库
			$baseUrl = EXTEND_PATH . 'Function/';
		}
	}
	if (substr($baseUrl, -1) != '/') {
		$baseUrl .= '/';
	}

	require_cache($baseUrl . $name . $ext);
}

/**
 * 快速导入第三方框架类库 所有第三方框架的类库文件统一放到 系统的Vendor目录下面
 * @param string $class 类库
 * @param string $baseUrl 基础目录
 * @param string $ext 类库后缀
 * @return boolean
 */
function vendor($class, $baseUrl = '', $ext = '.php') {
	if (empty($baseUrl)) {
		$baseUrl = VENDOR_PATH;
	}

	return import($class, $baseUrl, $ext);
}

/**
 * 快速定义和导入别名 支持批量定义
 * @param string|array $alias 类库别名
 * @param string $classfile 对应类库
 * @return boolean
 */
function alias_import($alias, $classfile = '') {
	static $_alias = array();
	if (is_string($alias)) {
		if (isset($_alias[$alias])) {
			return require_cache($_alias[$alias]);
		} elseif ('' !== $classfile) {
			// 定义别名导入
			$_alias[$alias] = $classfile;
			return;
		}
	} elseif (is_array($alias)) {
		$_alias = array_merge($_alias, $alias);
		return;
	}
	return false;
}

/**
 * D函数用于实例化Model 格式 项目://分组/模块
 * @param string $name Model资源地址
 * @param string $layer 业务层名称
 * @return Model
 */
function D($name = '', $layer = '') {
	if (empty($name)) {
		return new Model;
	}
	static $_model = array();
	$layer         = $layer ? $layer : C('DEFAULT_M_LAYER');
	if (strpos($name, '://')) {
        // 指定项目
		list($app) = explode('://', $name);
		$name      = str_replace('://', '/' . $layer . '/', $name);
	} else {
		$app  = C('DEFAULT_APP');
		$name = $app . '/' . $layer . '/' . $name;
	}
	if (isset($_model[$name])) {
		return $_model[$name];
	}
	$path = explode('/', $name);
	if ($list = C('EXTEND_GROUP_LIST') && isset($list[$app])) {
		// 扩展分组
		$baseUrl = $list[$app];
		import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl);
	} elseif (count($path) > 3 && 1 == C('APP_GROUP_MODE')) {
		// 独立分组
		$baseUrl = $path[0] == '@' ? dirname(BASE_LIB_PATH) : APP_PATH . '../' . $path[0] . '/' . C('APP_GROUP_PATH') . '/';
		import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl);
	} else {
		import($name . $layer);
	}
	$class = basename($name . $layer);
	if (class_exists($class)) {
		$model = new $class(basename($name));
	} else {
		$model = new Model(basename($name));
	}
	$_model[$name] = $model;
	return $model;
}

/**
 * M函数用于实例化一个没有模型文件的Model
 * @param string $name Model名称 支持指定基础模型 例如 MongoModel:User
 * @param string $tablePrefix 表前缀
 * @param mixed $connection 数据库连接信息
 * @return Model
 */
function M($name = '', $tablePrefix = '', $connection = '') {
	static $_model = array();
	if (strpos($name, ':')) {
		list($class, $name) = explode(':', $name);
	} else {
		$class = 'Model';
	}
	$guid = $tablePrefix . $name . '_' . $class;
	if (!isset($_model[$guid])) {
		$_model[$guid] = new $class($name, $tablePrefix, $connection);
	}

	return $_model[$guid];
}

/**
 * A函数用于实例化Action 格式：[项目://][分组/]模块
 * @param string $name Action资源地址
 * @param string $layer 控制层名称
 * @param boolean $common 是否公共目录
 * @return Action|false
 */
function A($name, $layer = '', $common = false) {
	static $_action = array();
	$layer          = $layer ? $layer : C('DEFAULT_C_LAYER');
	if (strpos($name, '://')) {
// 指定项目
		list($app) = explode('://', $name);
		$name      = str_replace('://', '/' . $layer . '/', $name);
	} else {
		$app  = '@';
		$name = '@/' . $layer . '/' . $name;
	}
	if (isset($_action[$name])) {
		return $_action[$name];
	}

	$path = explode('/', $name);
	if ($list = C('EXTEND_GROUP_LIST') && isset($list[$app])) {
		// 扩展分组
		$baseUrl = $list[$app];
		import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl);
	} elseif (count($path) > 3 && 1 == C('APP_GROUP_MODE')) {
		// 独立分组
		$baseUrl = $path[0] == '@' ? dirname(BASE_LIB_PATH) : APP_PATH . '../' . $path[0] . '/' . C('APP_GROUP_PATH') . '/';
		import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl);
	} elseif ($common) {
		// 加载公共类库目录
		import(str_replace('@/', '', $name) . $layer, LIB_PATH);
	} else {
		import($name . $layer);
	}
	$class = basename($name . $layer);
	if (class_exists($class, false)) {
		$action         = new $class();
		$_action[$name] = $action;
		return $action;
	} else {
		return false;
	}
}

/**
 * 远程调用模块的操作方法 URL 参数格式 [项目://][分组/]模块/操作
 * @param string $url 调用地址
 * @param string|array $vars 调用参数 支持字符串和数组
 * @param string $layer 要调用的控制层名称
 * @return mixed
 */
function R($url, $vars = array(), $layer = '') {
	$info   = pathinfo($url);
	$action = $info['basename'];
	$module = $info['dirname'];
	$class  = A($module, $layer);
	if ($class) {
		if (is_string($vars)) {
			parse_str($vars, $vars);
		}
		return call_user_func_array(array(&$class, $action . C('ACTION_SUFFIX')), $vars);
	} else {
		return false;
	}
}

/**
 * 获取和设置语言定义(不区分大小写)
 * @param string|array $name 语言变量
 * @param string $value 语言值
 * @return mixed
 */
function L($name = null, $value = null) {
	static $_lang = array();
	// 空参数返回所有定义
	if (empty($name)) {
		return $_lang;
	}

	// 判断语言获取(或设置)
	// 若不存在,直接返回全大写$name
	if (is_string($name)) {
		$name = strtoupper($name);
		if (is_null($value)) {
			return isset($_lang[$name]) ? $_lang[$name] : $name;
		}

		$_lang[$name] = $value; // 语言定义
		return;
	}
	// 批量定义
	if (is_array($name)) {
		$_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER));
	}

	return;
}

/**
 * 获取和设置配置参数 支持批量定义
 * @param string|array $name 配置变量
 * @param mixed $value 配置值
 * @return mixed
 */
function C($name = null, $value = null) {
	static $_config = array();
	// 无参数时获取所有
	if (empty($name)) {
		if (!empty($value) && $array = S('c_' . $value)) {
			$_config = array_merge($_config, array_change_key_case($array));
		}
		return $_config;
	}
	// 优先执行设置获取或赋值
	if (is_string($name)) {
		if (!strpos($name, '.')) {
			$name = strtolower($name);
			if (is_null($value)) {
				return isset($_config[$name]) ? $_config[$name] : null;
			}

			$_config[$name] = $value;
			return;
		}
		// 二维数组设置和获取支持
		$name    = explode('.', $name);
		$name[0] = strtolower($name[0]);
		if (is_null($value)) {
			return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
		}

		$_config[$name[0]][$name[1]] = $value;
		return;
	}
	// 批量设置
	if (is_array($name)) {
		$_config = array_merge($_config, array_change_key_case($name));
		if (!empty($value)) {
// 保存配置值
			S('c_' . $value, $_config);
		}
		return;
	}
	return null; // 避免非法参数
}

/**
 * 处理标签扩展
 * @param string $tag 标签名称
 * @param mixed $params 传入参数
 * @return mixed
 */
function tag($tag, &$params = NULL) {
	// 系统标签扩展
	$extends = C('extends.' . $tag);
	// 应用标签扩展
	$tags = C('tags.' . $tag);
	if (!empty($tags)) {
		if (empty($tags['_overlay']) && !empty($extends)) {
			// 合并扩展
			$tags = array_unique(array_merge($extends, $tags));
		} elseif (isset($tags['_overlay'])) {
			// 通过设置 '_overlay'=>1 覆盖系统标签
			unset($tags['_overlay']);
		}
	} elseif (!empty($extends)) {
		$tags = $extends;
	}
	if ($tags) {
		if (APP_DEBUG) {
			G($tag . 'Start');
			trace('[ ' . $tag . ' ] --START--', '', 'INFO');
		}
		// 执行扩展
		foreach ($tags as $key => $name) {
			if (!is_int($key)) {
				// 指定行为类的完整路径 用于模式扩展
				$name = $key;
			}
			B($name, $params);
		}
		if (APP_DEBUG) {
			// 记录行为的执行日志
			trace('[ ' . $tag . ' ] --END-- [ RunTime:' . G($tag . 'Start', $tag . 'End', 6) . 's ]', '', 'INFO');
		}
	} else {
		// 未执行任何行为 返回false
		return false;
	}
}

/**
 * 动态添加行为扩展到某个标签
 * @param string $tag 标签名称
 * @param string $behavior 行为名称
 * @param string $path 行为路径
 * @return void
 */
function add_tag_behavior($tag, $behavior, $path = '') {
	$array = C('tags.' . $tag);
	if (!$array) {
		$array = array();
	}
	if ($path) {
		$array[$behavior] = $path;
	} else {
		$array[] = $behavior;
	}
	C('tags.' . $tag, $array);
}

/**
 * 执行某个行为
 * @param string $name 行为名称
 * @param Mixed $params 传入的参数
 * @return void
 */
function B($name, &$params = NULL) {
	if (strpos($name, '/')) {
		list($name, $method) = explode('/', $name);
	} else {
		$method = 'run';
	}
	$class = $name . 'Behavior';
	if (APP_DEBUG) {
		G('behaviorStart');
	}
	$behavior = new $class();
	$behavior->$method($params);
	if (APP_DEBUG) {
		// 记录行为的执行日志
		G('behaviorEnd');
		trace($name . ' Behavior ::' . $method . ' [ RunTime:' . G('behaviorStart', 'behaviorEnd', 6) . 's ]', '', 'INFO');
	}
}

/**
 * 去除代码中的空白和注释
 * @param string $content 代码内容
 * @return string
 */
function strip_whitespace($content) {
	$stripStr = '';
	//分析php源码
	$tokens     = token_get_all($content);
	$last_space = false;
	for ($i = 0, $j = count($tokens); $i < $j; $i++) {
		if (is_string($tokens[$i])) {
			$last_space = false;
			$stripStr .= $tokens[$i];
		} else {
			switch ($tokens[$i][0]) {
				//过滤各种PHP注释
				case T_COMMENT:
				case T_DOC_COMMENT:
					break;
				//过滤空格
				case T_WHITESPACE:
					if (!$last_space) {
						$stripStr .= ' ';
						$last_space = true;
					}
					break;
				case T_START_HEREDOC:
					$stripStr .= "<<<THINK\n";
					break;
				case T_END_HEREDOC:
					$stripStr .= "THINK;\n";
					for ($k = $i + 1; $k < $j; $k++) {
						if (is_string($tokens[$k]) && $tokens[$k] == ';') {
							$i = $k;
							break;
						} else if ($tokens[$k][0] == T_CLOSE_TAG) {
							break;
						}
					}
					break;
				default:
					$last_space = false;
					$stripStr .= $tokens[$i][1];
			}
		}
	}
	return $stripStr;
}

//[RUNTIME]
// 编译文件
function compile($filename) {
	$content = file_get_contents($filename);
	// 替换预编译指令
	$content = preg_replace('/\/\/\[RUNTIME\](.*?)\/\/\[\/RUNTIME\]/s', '', $content);
	$content = substr(trim($content), 5);
	if ('?>' == substr($content, -2)) {
		$content = substr($content, 0, -2);
	}

	return $content;
}

// 根据数组生成常量定义
function array_define($array, $check = true) {
	$content = "\n";
	foreach ($array as $key => $val) {
		$key = strtoupper($key);
		if ($check) {
			$content .= 'defined(\'' . $key . '\') or ';
		}

		if (is_int($val) || is_float($val)) {
			$content .= "define('" . $key . "'," . $val . ');';
		} elseif (is_bool($val)) {
			$val = ($val) ? 'true' : 'false';
			$content .= "define('" . $key . "'," . $val . ');';
		} elseif (is_string($val)) {
			$content .= "define('" . $key . "','" . addslashes($val) . "');";
		}
		$content .= "\n";
	}
	return $content;
}
//[/RUNTIME]

/**
 * 添加和获取页面Trace记录
 * @param string $value 变量
 * @param string $label 标签
 * @param string $level 日志级别
 * @param boolean $record 是否记录日志
 * @return void
 */
function trace($value = '[think]', $label = '', $level = 'DEBUG', $record = false) {
	static $_trace = array();
	if ('[think]' === $value) {
		// 获取trace信息
		return $_trace;
	} else {
		$info = ($label ? $label . ':' : '') . print_r($value, true);
		if ('ERR' == $level && C('TRACE_EXCEPTION')) {
// 抛出异常
			throw_exception($info);
		}
		$level = strtoupper($level);
		if (!isset($_trace[$level])) {
			$_trace[$level] = array();
		}
		$_trace[$level][] = $info;
		if ((defined('IS_AJAX') && IS_AJAX) || !C('SHOW_PAGE_TRACE') || $record) {
			Log::record($info, $level, $record);
		}
	}
}